if ( !window.controller ) throw new Error( '"controller" not initialized' );
if ( !controller.Timer ) {
/**
* Контроллер проводник данных
* - Отсылка и прием Ajax запросов
* - Прием данных от commet сервера 
*/
	controller.Timer = new (function(){
		var $ = controller;
	/** Тик происходит 1 раз в секунду **/
		var curentTick = 0,
			timerID,
			delay = 100;
		var last_event = new Date().getTime();
		var Timer = function(){
			TimerSuperPrototype.constructor.call( this );
			var t = this;
			timerID = setTimeout(function(){t._delay();},delay);
			
		}
		
		
		
		
		
		$.extend( Timer, $.events.EventDispatcher );

		var TimerPrototype 			= Timer.prototype,
			TimerSuperPrototype 	= Timer.superPrototype;
		//DataProviderPrototype.
		var dispatchEvent= TimerPrototype.dispatchEvent;
		var EEvent = $.events.Event;	
		
		
		var eventList = new Object();
		
		
		TimerPrototype._delay = function(){
			// Вычисляем тики которые пропустили;
			var d2 = new Date().getTime();
			var tiks = Math.floor( (d2 - last_event)/1000 );
			if(tiks > 0){
				last_event = d2;
				for(var i=1; i <= tiks; i++){
					curentTick++;
					this.getEventTick(curentTick);
				}
				
			}
			/*curentTick ++;
			//console.log(curentTick);
			//var d1 = new Date().getTime();
			for(var i in eventList){
				if(eventList[i].n == curentTick){
					eventList[i].l = curentTick;
					eventList[i].n += eventList[i].e;
					var event 	 = new EEvent( "TIMER" );
					event.action = i;
					event.data 	 = eventList[i];
					dispatchEvent.call(this, event);
					
				}
			}
			var d2 = new Date().getTime();
			*/
			//alert(delay - (d2 - d1));
			var t = this;
			timerID = setTimeout(function(){t._delay();}, delay);
		}
		
		TimerPrototype.getEventTick = function(tick){
			for(var i in eventList){
				if(eventList[i].n == tick){
					eventList[i].l = tick;
					eventList[i].n += eventList[i].e;
					var event 	 = new EEvent( "TIMER" );
					event.action = i;
					event.t = tick;
					event.data 	 = eventList[i];
					dispatchEvent.call(this, event);
				}
			}
		}
		
		
		/**
		* Добавить событие в таймер
		* @name - String название события для опознования события
		* @evry - Каждые N секунд
		* @next - первый вызов через next тиков
		*/
		TimerPrototype.addEvent = function(name, evry, next){
			if(eventList[name]){
				this.updateEvent(name, evry, next);
			}else{
				eventList[name] = 
				{
					e : evry , // Каждый evry тик высызвать событие
					l : 0,    // Последний тик был
					n : curentTick + ((next != null) ?  next : evry)  // Следующий тик будет
				}/**/
			}
			
		}
		
		/**
		* Удалить из просмотра событий
		*/
		TimerPrototype.removeEvent = function(name){
		
		}
		
		
		
		return Timer;
	}());
}